home *** CD-ROM | disk | FTP | other *** search
/ Java Primer Plus / Java Primer Plus (Waite Group Proess)(1996).iso / java_Win / demo / WireFrame / Model3D.class (.txt) < prev    next >
Encoding:
Java Class File  |  1995-12-06  |  4.1 KB  |  315 lines

  1. import java.awt.Color;
  2. import java.awt.Graphics;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.StreamTokenizer;
  6.  
  7. class Model3D {
  8.    float[] vert;
  9.    int[] tvert;
  10.    int nvert;
  11.    int maxvert;
  12.    int[] con;
  13.    int ncon;
  14.    int maxcon;
  15.    boolean transformed;
  16.    Matrix3D mat;
  17.    float xmin;
  18.    float xmax;
  19.    float ymin;
  20.    float ymax;
  21.    float zmin;
  22.    float zmax;
  23.    // $FF: renamed from: gr java.awt.Color[]
  24.    static Color[] field_0;
  25.  
  26.    Model3D() {
  27.       this.mat = new Matrix3D();
  28.       this.mat.xrot((double)20.0F);
  29.       this.mat.yrot((double)30.0F);
  30.    }
  31.  
  32.    Model3D(InputStream var1) throws IOException, FileFormatException {
  33.       this();
  34.       StreamTokenizer var2 = new StreamTokenizer(var1);
  35.       var2.eolIsSignificant(true);
  36.       var2.commentChar(35);
  37.  
  38.       label82:
  39.       while(true) {
  40.          switch (var2.nextToken()) {
  41.             case -3:
  42.                if ("v".equals(var2.sval)) {
  43.                   double var9 = (double)0.0F;
  44.                   double var11 = (double)0.0F;
  45.                   double var7 = (double)0.0F;
  46.                   if (var2.nextToken() == -2) {
  47.                      var9 = var2.nval;
  48.                      if (var2.nextToken() == -2) {
  49.                         var11 = var2.nval;
  50.                         if (var2.nextToken() == -2) {
  51.                            var7 = var2.nval;
  52.                         }
  53.                      }
  54.                   }
  55.  
  56.                   this.addVert((float)var9, (float)var11, (float)var7);
  57.  
  58.                   while(var2.ttype != 10 && var2.ttype != -1) {
  59.                      var2.nextToken();
  60.                   }
  61.                } else if (!"f".equals(var2.sval) && !"fo".equals(var2.sval) && !"l".equals(var2.sval)) {
  62.                   while(var2.nextToken() != 10 && var2.ttype != -1) {
  63.                   }
  64.                } else {
  65.                   int var3 = -1;
  66.                   int var4 = -1;
  67.                   int var5 = -1;
  68.  
  69.                   while(true) {
  70.                      while(var2.nextToken() != -2) {
  71.                         if (var2.ttype != 47) {
  72.                            if (var3 >= 0) {
  73.                               this.add(var3 - 1, var4 - 1);
  74.                            }
  75.  
  76.                            if (var2.ttype != 10) {
  77.                               break label82;
  78.                            }
  79.                            continue label82;
  80.                         }
  81.  
  82.                         var2.nextToken();
  83.                      }
  84.  
  85.                      var5 = (int)var2.nval;
  86.                      if (var4 >= 0) {
  87.                         this.add(var4 - 1, var5 - 1);
  88.                      }
  89.  
  90.                      if (var3 < 0) {
  91.                         var3 = var5;
  92.                      }
  93.  
  94.                      var4 = var5;
  95.                   }
  96.                }
  97.             case 10:
  98.                break;
  99.             default:
  100.                break label82;
  101.          }
  102.       }
  103.  
  104.       var1.close();
  105.       if (var2.ttype != -1) {
  106.          throw new FileFormatException(var2.toString());
  107.       }
  108.    }
  109.  
  110.    int addVert(float var1, float var2, float var3) {
  111.       int var4 = this.nvert;
  112.       if (var4 >= this.maxvert) {
  113.          if (this.vert == null) {
  114.             this.maxvert = 100;
  115.             this.vert = new float[this.maxvert * 3];
  116.          } else {
  117.             this.maxvert *= 2;
  118.             float[] var5 = new float[this.maxvert * 3];
  119.             System.arraycopy(this.vert, 0, var5, 0, this.vert.length);
  120.             this.vert = var5;
  121.          }
  122.       }
  123.  
  124.       var4 *= 3;
  125.       this.vert[var4] = var1;
  126.       this.vert[var4 + 1] = var2;
  127.       this.vert[var4 + 2] = var3;
  128.       return this.nvert++;
  129.    }
  130.  
  131.    void add(int var1, int var2) {
  132.       int var3 = this.ncon;
  133.       if (var1 < this.nvert && var2 < this.nvert) {
  134.          if (var3 >= this.maxcon) {
  135.             if (this.con == null) {
  136.                this.maxcon = 100;
  137.                this.con = new int[this.maxcon];
  138.             } else {
  139.                this.maxcon *= 2;
  140.                int[] var4 = new int[this.maxcon];
  141.                System.arraycopy(this.con, 0, var4, 0, this.con.length);
  142.                this.con = var4;
  143.             }
  144.          }
  145.  
  146.          if (var1 > var2) {
  147.             int var5 = var1;
  148.             var1 = var2;
  149.             var2 = var5;
  150.          }
  151.  
  152.          this.con[var3] = var1 << 16 | var2;
  153.          this.ncon = var3 + 1;
  154.       }
  155.    }
  156.  
  157.    void transform() {
  158.       if (!this.transformed && this.nvert > 0) {
  159.          if (this.tvert == null || this.tvert.length < this.nvert * 3) {
  160.             this.tvert = new int[this.nvert * 3];
  161.          }
  162.  
  163.          this.mat.transform(this.vert, this.tvert, this.nvert);
  164.          this.transformed = true;
  165.       }
  166.    }
  167.  
  168.    private void sort(int var1, int var2) {
  169.       int[] var3 = this.con;
  170.       int var4 = var1;
  171.       int var5 = var2;
  172.       if (var1 < var2) {
  173.          int var6 = var3[(var1 + var2) / 2];
  174.  
  175.          while(var4 < var5) {
  176.             while(var4 < var5 && var3[var4] < var6) {
  177.                ++var4;
  178.             }
  179.  
  180.             while(var4 < var5 && var3[var5] >= var6) {
  181.                --var5;
  182.             }
  183.  
  184.             if (var4 < var5) {
  185.                int var7 = var3[var4];
  186.                var3[var4] = var3[var5];
  187.                var3[var5] = var7;
  188.             }
  189.          }
  190.  
  191.          if (var5 < var4) {
  192.             var4 = var5;
  193.          }
  194.  
  195.          this.sort(var1, var4);
  196.          this.sort(var4 == var1 ? var4 + 1 : var4, var2);
  197.       }
  198.    }
  199.  
  200.    void compress() {
  201.       int var1 = this.ncon;
  202.       int[] var2 = this.con;
  203.       this.sort(0, this.ncon - 1);
  204.       int var3 = 0;
  205.       int var4 = -1;
  206.  
  207.       for(int var5 = 0; var5 < var1; ++var5) {
  208.          int var6 = var2[var5];
  209.          if (var4 != var6) {
  210.             var2[var3] = var6;
  211.             ++var3;
  212.          }
  213.  
  214.          var4 = var6;
  215.       }
  216.  
  217.       this.ncon = var3;
  218.    }
  219.  
  220.    void paint(Graphics var1) {
  221.       if (this.vert != null && this.nvert > 0) {
  222.          this.transform();
  223.          if (field_0 == null) {
  224.             field_0 = new Color[16];
  225.  
  226.             for(int var2 = 0; var2 < 16; ++var2) {
  227.                int var3 = (int)((double)170.0F * ((double)1.0F - Math.pow((double)var2 / (double)15.0F, 2.3)));
  228.                field_0[var2] = new Color(var3, var3, var3);
  229.             }
  230.          }
  231.  
  232.          int var11 = 0;
  233.          int var12 = this.ncon;
  234.          int[] var4 = this.con;
  235.          int[] var5 = this.tvert;
  236.          if (var12 > 0 && this.nvert > 0) {
  237.             for(int var6 = 0; var6 < var12; ++var6) {
  238.                int var7 = var4[var6];
  239.                int var8 = (var7 >> 16 & '\uffff') * 3;
  240.                int var9 = (var7 & '\uffff') * 3;
  241.                int var10 = var5[var8 + 2] + var5[var9 + 2];
  242.                if (var10 < 0) {
  243.                   var10 = 0;
  244.                }
  245.  
  246.                if (var10 > 15) {
  247.                   var10 = 15;
  248.                }
  249.  
  250.                if (var10 != var11) {
  251.                   var11 = var10;
  252.                   var1.setColor(field_0[var10]);
  253.                }
  254.  
  255.                var1.drawLine(var5[var8], var5[var8 + 1], var5[var9], var5[var9 + 1]);
  256.             }
  257.  
  258.          }
  259.       }
  260.    }
  261.  
  262.    void findBB() {
  263.       if (this.nvert > 0) {
  264.          float[] var1 = this.vert;
  265.          float var2 = var1[0];
  266.          float var3 = var2;
  267.          float var4 = var1[1];
  268.          float var5 = var4;
  269.          float var6 = var1[2];
  270.          float var7 = var6;
  271.          int var8 = this.nvert * 3;
  272.  
  273.          while(true) {
  274.             var8 -= 3;
  275.             if (var8 <= 0) {
  276.                this.xmax = var3;
  277.                this.xmin = var2;
  278.                this.ymax = var5;
  279.                this.ymin = var4;
  280.                this.zmax = var7;
  281.                this.zmin = var6;
  282.                return;
  283.             }
  284.  
  285.             float var9 = var1[var8];
  286.             if (var9 < var2) {
  287.                var2 = var9;
  288.             }
  289.  
  290.             if (var9 > var3) {
  291.                var3 = var9;
  292.             }
  293.  
  294.             float var10 = var1[var8 + 1];
  295.             if (var10 < var4) {
  296.                var4 = var10;
  297.             }
  298.  
  299.             if (var10 > var5) {
  300.                var5 = var10;
  301.             }
  302.  
  303.             float var11 = var1[var8 + 2];
  304.             if (var11 < var6) {
  305.                var6 = var11;
  306.             }
  307.  
  308.             if (var11 > var7) {
  309.                var7 = var11;
  310.             }
  311.          }
  312.       }
  313.    }
  314. }
  315.